package com.tancire.common.utils;


import com.tancire.common.exception.PriceCalcException;

/**
 * 金额计算工具类
 * 以分为单位
 *
 * @author chenchao
 * @version 1.0
 * @since 2024/8/31 19:59
 */
public class PriceUtils {

    /**
     * 默认进位
     */
    public static final int ROUND_UP = 0;

    /**
     * 默认全舍
     */
    public static final int ROUND_DOWN = 1;

    /**
     * 四舍五入
     */
    public static final int ROUND_HALF_UP = 4;

    /**
     * 计算乘以
     *
     * @param price 被乘数
     * @param count 乘数
     * @return 结果
     */
    public static long multiply(Long price, Integer count) {
        if (null == count || null == price) {
            return 0L;
        }
        return price * count;
    }

    /**
     * 计算除以
     * 默认四舍五入
     *
     * @param left 被除数
     * @param right 除数
     * @return 结果
     */
    public static long divided(Long left, Long right) {
        return divided(left, right, ROUND_DOWN, 1);
    }

    /**
     * 计算除以
     * 默认舍去
     *
     * @param left 被除数
     * @param right 除数
     * @return 结果
     */
    public static long dividedDown(Long left, Long right) {
        return divided(left, right, ROUND_HALF_UP, 1);
    }

    /**
     * 计算除以
     *
     * @param left 被除数
     * @param right 除数
     * @param mode 模式
     * @param enlarge 放大倍数，用于精细度小数
     * @return
     */
    public static long divided(Long left, Long right, int mode, int enlarge) {
        if (null == right || null == left) {
            throw new PriceCalcException("参数不能为空");
        }
        if (right.equals(0L)) {
            throw new PriceCalcException("除数不能为0");
        }
        left = left * enlarge;
        right = right * enlarge;
        long div = left / right;
        long rem = left % right;
        if (ROUND_UP == mode && rem > 0) {
            return div + 1;
        } else if (ROUND_HALF_UP == mode && rem > 0) {
            String remStr = String.valueOf(rem);
            String firstRem = remStr.substring(0, 1);
            long remFirst = Long.parseLong(firstRem);
            if (remFirst > 5) {
                return div + 1;
            }
        }
        return div;
    }

    /**
     * 计算减法
     *
     * @param left 被减数
     * @param right 减数
     * @return 结束
     */
    public static long minus(Long left, Long right) {
        if (null == right || null == left) {
            throw new PriceCalcException("参数不能为空");
        }
        return left - right;
    }

    /**
     * 计算加法
     *
     * @param left 被加数
     * @param right 加数
     * @return 结果
     */
    public static long add(Long left, Long right) {
        if (null == right || null == left) {
            throw new PriceCalcException("参数不能为空");
        }
        return left + right;
    }

}
